Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / LXST.git / files / docs / rns_audio_call_calc.py

Displaying Raw • Download


docs/rns_audio_call_calc.py c74d2dd5cbffdff82fdb707ef50ce04937c9689f (c74d2dd5) Text, 5.98 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787math
Tff7b72import T7ee787RNS
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787mp

Tff7b72def Td2a8ffsimulateTb4b4b4(Te6edf3link_speedTff7b72=T79c0ff2735Tb4b4b4, Te6edf3audio_slot_msTff7b72=T79c0ff400Tb4b4b4, Te6edf3codec_rateTff7b72=T79c0ff1200Tb4b4b4,
Te6edf3signalling_bytesTff7b72=T79c0ff14Tb4b4b4, Te6edf3token_overheadTff7b72=T79c0ff48Tb4b4b4, Te6edf3methodTff7b72=Ta5d6ff"Ta5d6ffmsgpackTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# Simulated on-air link speed
Te6edf3LINK_SPEED Tff7b72= Te6edf3link_speed

T8b949e# Packing method, can be "msgpack" or "protobuf"
Te6edf3PACKING_METHOD Tff7b72= Te6edf3method

T8b949e# The target audio slot time
Te6edf3TARGET_MS Tff7b72= Te6edf3audio_slot_ms

T8b949e# Packets needed per second for half-duplex audio
Te6edf3PACKETS_PER_SECOND Tff7b72= T79c0ff1000Tff7b72/Te6edf3TARGET_MS

T8b949e# Effective audio encoder bitrate
Te6edf3CODEC_RATE Tff7b72= Te6edf3codec_rate

T8b949e# Per-packet overhead on a established link is 19
T8b949e# bytes, 3 for header and context, 16 for link ID
Te6edf3RNS_OVERHEAD Tff7b72= T79c0ff19

T8b949e# Physical-layer overhead. For RNode, this is 1
T8b949e# byte per RNS packet.
Te6edf3PHY_OVERHEAD Tff7b72= T79c0ff1

T8b949e# Total transport overhead
Te6edf3TRANSPORT_OVERHEAD Tff7b72= Te6edf3PHY_OVERHEADTff7b72+Te6edf3RNS_OVERHEAD

T8b949e# Calculate parameters
Te6edf3AUDIO_LEN Tff7b72= Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3CODEC_RATETff7b72/Tb4b4b4(T79c0ff1000Tff7b72/Te6edf3TARGET_MSTb4b4b4)Tff7b72/T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3PER_BYTE_LATENCY_MS Tff7b72= T79c0ff1000Tff7b72/Tb4b4b4(Te6edf3LINK_SPEEDTff7b72/T79c0ff8Tb4b4b4)

T8b949e# Pack the message with msgpack to get real-
T8b949e# world packed message size

Tff7b72if Te6edf3PACKING_METHOD Tff7b72== Ta5d6ff"Ta5d6ffmsgpackTa5d6ff"Tb4b4b4:
T8b949e# Calculate msgpack overhead
Te6edf3PL_LEN Tff7b72= Tffa657lenTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3signalling_bytesTb4b4b4)Tb4b4b4, Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3AUDIO_LENTb4b4b4)Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3PACKING_OVERHEAD Tff7b72= Te6edf3PL_LENTff7b72-Te6edf3AUDIO_LEN
Tff7b72elif Te6edf3PACKING_METHOD Tff7b72== Ta5d6ff"Ta5d6ffprotobufTa5d6ff"Tb4b4b4:
T8b949e# For protobuf, assume the 8 bytes of stated overhead
Te6edf3PACKING_OVERHEAD Tff7b72= T79c0ff8
Te6edf3PL_LEN Tff7b72= Te6edf3AUDIO_LENTff7b72+Te6edf3PACKING_OVERHEAD
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported packing methodTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)

T8b949e# Calculate required encrypted token blocks
Te6edf3TOKEN_OVERHEAD Tff7b72= Te6edf3token_overhead
Te6edf3BLOCKSIZE Tff7b72= T79c0ff16
Te6edf3REQUIRED_BLOCKS Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tb4b4b4(Te6edf3PL_LENTff7b72+T79c0ff1Tb4b4b4)Tff7b72/Te6edf3BLOCKSIZETb4b4b4)
Te6edf3ENCRYPTED_PAYLOAD_LEN Tff7b72= Te6edf3REQUIRED_BLOCKSTff7b72*Te6edf3BLOCKSIZE
Te6edf3BLOCK_HEADROOM Tff7b72= Tb4b4b4(Te6edf3REQUIRED_BLOCKSTff7b72*Te6edf3BLOCKSIZETb4b4b4) Tff7b72- Te6edf3PL_LEN Tff7b72- T79c0ff1

T8b949e# The complete on-air packet length
Te6edf3PACKET_LEN Tff7b72= Te6edf3PHY_OVERHEADTff7b72+Te6edf3RNS_OVERHEADTff7b72+Te6edf3ENCRYPTED_PAYLOAD_LENTff7b72+Te6edf3TOKEN_OVERHEAD
Te6edf3PACKET_LATENCY Tff7b72= Tffa657roundTb4b4b4(Te6edf3PACKET_LENTff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)

T8b949e# TODO: This should include any additional
T8b949e# airtime consumption such as preamble and TX-tail.
Te6edf3PACKET_AIRTIME Tff7b72= Te6edf3PACKET_LENTff7b72*Te6edf3PER_BYTE_LATENCY_MS
Te6edf3AIRTIME_PCT Tff7b72= Tb4b4b4(Te6edf3PACKET_AIRTIMETff7b72/Te6edf3TARGET_MSTb4b4b4) Tff7b72* T79c0ff100

T8b949e# Maximum amount of concurrent full-duplex
T8b949e# calls that can coexist on the same channel
Te6edf3CONCURRENT_CALLS Tff7b72= Te6edf3mathTff7b72.Td2a8fffloorTb4b4b4(T79c0ff100Tff7b72/Te6edf3AIRTIME_PCTTb4b4b4)

T8b949e# Calculate latencies
Te6edf3TRANSPORT_LATENCY Tff7b72= Tffa657roundTb4b4b4(Tb4b4b4(Te6edf3PHY_OVERHEADTff7b72+Te6edf3RNS_OVERHEADTb4b4b4)Tff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3TOKEN_LATENCY Tff7b72= Tffa657roundTb4b4b4(Tb4b4b4(Te6edf3TOKEN_OVERHEADTb4b4b4)Tff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)

Te6edf3PAYLOAD_LATENCY Tff7b72= Tffa657roundTb4b4b4(Te6edf3ENCRYPTED_PAYLOAD_LENTff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3RAW_DATA_LATENCY Tff7b72= Tffa657roundTb4b4b4(Te6edf3AUDIO_LENTff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3PACKING_LATENCY Tff7b72= Tffa657roundTb4b4b4(Te6edf3PACKING_OVERHEADTff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3DATA_LATENCY Tff7b72= Tffa657roundTb4b4b4(Te6edf3ENCRYPTED_PAYLOAD_LENTff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3ENCRYPTION_LATENCY Tff7b72= Tffa657roundTb4b4b4(Tb4b4b4(Te6edf3ENCRYPTED_PAYLOAD_LENTff7b72-Te6edf3PL_LENTb4b4b4)Tff7b72*Te6edf3PER_BYTE_LATENCY_MSTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3ENCRYPTED_PAYLOAD_LENTff7b72-Te6edf3PL_LEN Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3E_OPT_STR Tff7b72= Ta5d6ff"Ta5d6ff(optimal)Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3E_OPT_STR Tff7b72= Ta5d6ff"Ta5d6ff(sub-optimal)Ta5d6ff"

Te6edf3TOTAL_LATENCY Tff7b72= Tffa657roundTb4b4b4(Te6edf3TARGET_MSTff7b72+Te6edf3PACKET_LATENCYTb4b4b4, T79c0ff1Tb4b4b4)

Tffa657printTb4b4b4( Ta5d6ff"Tffea00\nTa5d6ff===== Simulation Parameters ===Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Packing method : Tffd700{Te6edf3methodTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Sampling delay : Tffd700{Te6edf3TARGET_MSTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Codec bitrate : Tffd700{Te6edf3CODEC_RATETffd700}Ta5d6ff bpsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Audio data : Tffd700{Te6edf3AUDIO_LENTffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Packing overhead : Tffd700{Te6edf3PACKING_OVERHEADTffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Payload length : Tffd700{Te6edf3PL_LENTffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff AES blocks needed : Tffd700{Te6edf3REQUIRED_BLOCKSTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Encrypted payload : Tffd700{Te6edf3ENCRYPTED_PAYLOAD_LENTffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Token overhead : Tffd700{Te6edf3TOKEN_OVERHEADTffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Transport overhead : Tffd700{Te6edf3TRANSPORT_OVERHEADTffd700}Ta5d6ff bytes (Tffd700{Te6edf3RNS_OVERHEADTffd700}Ta5d6ff from RNS, Tffd700{Te6edf3PHY_OVERHEADTffd700}Ta5d6ff from PHY)Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff On-air length : Tffd700{Te6edf3PACKET_LENTffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Packet airtime : Tffd700{Tffa657roundTb4b4b4(Te6edf3PACKET_AIRTIMETb4b4b4,T79c0ff2Tb4b4b4)Tffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Transport bitrate : Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Tb4b4b4(Te6edf3PACKET_LENTff7b72*T79c0ff8Tb4b4b4)Tff7b72/Tb4b4b4(Te6edf3TARGET_MSTff7b72/T79c0ff1000Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)

Tffa657printTb4b4b4( Ta5d6ff"Tffea00\nTa5d6ff===== Results for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Te6edf3LINK_SPEEDTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Link Speed ===Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Final latency : Tffd700{Te6edf3TOTAL_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Recording latency : contributes Tffd700{Te6edf3TARGET_MSTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Packet transport : contributes Tffd700{Te6edf3PACKET_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Payload : contributes Tffd700{Te6edf3PAYLOAD_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Audio data : contributes Tffd700{Te6edf3RAW_DATA_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Packing format : contributes Tffd700{Te6edf3PACKING_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Encryption : contributes Tffd700{Te6edf3ENCRYPTION_LATENCYTffd700}Ta5d6ffms Tffd700{Te6edf3E_OPT_STRTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Token overhead : contributes Tffd700{Te6edf3TOKEN_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff RNS+PHY overhead : contributes Tffd700{Te6edf3TRANSPORT_LATENCYTffd700}Ta5d6ffmsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Half-duplex airtime : Tffd700{Tffa657roundTb4b4b4(Te6edf3AIRTIME_PCTTb4b4b4, T79c0ff2Tb4b4b4)Tffd700}Ta5d6ff% of link capacityTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Concurrent calls : Tffd700{Tffa657intTb4b4b4(Te6edf3CONCURRENT_CALLSTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Full-duplex airtime : Tffd700{Tffa657roundTb4b4b4(Te6edf3AIRTIME_PCTTff7b72*T79c0ff2Tb4b4b4, T79c0ff2Tb4b4b4)Tffd700}Ta5d6ff% of link capacityTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Concurrent calls : Tffd700{Tffa657intTb4b4b4(Te6edf3CONCURRENT_CALLSTff7b72/T79c0ff2Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3BLOCK_HEADROOM Tff7b72!= T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Unaligned AES block! Each packet could fitTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3BLOCK_HEADROOMTffd700}Ta5d6ff bytes of additional audio dataTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Ta5d6ff"Tb4b4b4)

T8b949e#print( "\n= With mspack =================")
T8b949e#simulate(method="msgpack")

T8b949e# simulate(link_speed=10980, audio_slot_ms=180, codec_rate=3200,
T8b949e# signalling_bytes=18, method="msgpack")

T8b949e# simulate(link_speed=4690, audio_slot_ms=480, codec_rate=1200,
T8b949e# signalling_bytes=18, method="msgpack")

T8b949e#simulate(link_speed=60e3, audio_slot_ms=270, codec_rate=12000,
T8b949e# signalling_bytes=18, method="msgpack")

Te6edf3simulateTb4b4b4(Te6edf3link_speedTff7b72=T79c0ff10e3Tb4b4b4, Te6edf3audio_slot_msTff7b72=T79c0ff353Tb4b4b4, Te6edf3codec_rateTff7b72=T79c0ff6000Tb4b4b4,
Te6edf3signalling_bytesTff7b72=T79c0ff0Tb4b4b4, Te6edf3token_overheadTff7b72=T79c0ff16Tff7b72+T79c0ff32Tff7b72*T79c0ff1Tb4b4b4, Te6edf3methodTff7b72=Ta5d6ff"Ta5d6ffmsgpackTa5d6ff"Tb4b4b4)

T8b949e#print("\n\n= With protobuf ===============")
T8b949e#simulate(method="protobuf")


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────